package com.longway.core.toolbox.wdp.msg;

import com.jfinal.aop.Before;
import com.jfinal.core.Controller;
import com.jfinal.core.NotAction;
import com.jfinal.kit.HttpKit;
import com.jfinal.kit.StrKit;
import com.jfinal.log.Log;
import com.longway.core.toolbox.wdp.WdpConfigKit;
import com.longway.core.toolbox.wdp.msg.bean.WdpImageMsg;
import com.longway.core.toolbox.wdp.msg.bean.WdpMsg;
import com.longway.core.toolbox.wdp.msg.bean.WdpTextMsg;
import com.longway.core.toolbox.wdp.msg.bean.WdpUserEnterSessionMsg;

/**
 * 第三方平台消息控制器
 */
public abstract class WdpMsgController extends Controller {
    // 将 xml 和 in msg 存储到 request 中，解决控制器 单例的问题
    protected static final Log log = Log.getLog(WdpMsgController.class);
    // 本次请求 xml数据
    private String wxaMsgXml = null;
    // 本次请求 xml 解析后的 wxaMsg 对象
    private WdpMsg wxaMsg = null;

    @Override
    protected void _clear_() {
        super._clear_();
        this.wxaMsgXml = null;
        this.wxaMsg = null;
    }

    @Before(WdpMsgInterceptor.class)
    public void index() {
        // 开发模式输出微信服务发送过来的  xml、json 消息
        if (WdpConfigKit.isDevMode()) {
            System.out.println("接收消息:");
            System.out.println(getWdpMsgXml());
        }
        WdpMsg wxaMsg = getWdpMsg();

        if (wxaMsg instanceof WdpTextMsg) {
            processTextMsg((WdpTextMsg) wxaMsg);
        } else if (wxaMsg instanceof WdpImageMsg) {
            processImageMsg((WdpImageMsg) wxaMsg);
        } else if (wxaMsg instanceof WdpUserEnterSessionMsg) {
            processUserEnterSessionMsg((WdpUserEnterSessionMsg) wxaMsg);
        } else {
            log.error("未能识别的小程序消息类型。 消息内容为：\n" + getWdpMsgXml());
        }

        // 直接回复success（推荐方式）
        renderText("success");
    }

    @NotAction
    public String getWdpMsgXml() {
        if (wxaMsgXml == null) {
            wxaMsgXml = HttpKit.readData(getRequest());
            // 是否需要解密消息
            wxaMsgXml = MsgEncryptKit.decrypt(wxaMsgXml);
        }
        if (StrKit.isBlank(wxaMsgXml)) {
            throw new RuntimeException("请不要在浏览器中请求该连接");
        }
        return wxaMsgXml;
    }

    @NotAction
    public WdpMsg getWdpMsg() {
        if (wxaMsg == null) {
            IMsgParser msgParser = WdpConfigKit.getMsgParser();
            wxaMsg = msgParser.parser(getWdpMsgXml());
        }
        return wxaMsg;
    }

    /**
     * 处理接收到的文本消息
     * @param textMsg 处理接收到的文本消息
     */
    protected abstract void processTextMsg(WdpTextMsg textMsg);

    /**
     * 处理接收到的图片消息
     * @param imageMsg 处理接收到的图片消息
     */
    protected abstract void processImageMsg(WdpImageMsg imageMsg);

    /**
     * 处理接收到的进入会话事件
     * @param userEnterSessionMsg 处理接收到的进入会话事件
     */
    protected abstract void processUserEnterSessionMsg(WdpUserEnterSessionMsg userEnterSessionMsg);

}
